﻿using System;
using FTools.Interface;
using FTools.Persistencia;
using System.Data.SqlClient;
using FTools.Dominio;
using System.Collections;
using FTools.Generico;

namespace FTools.Comunicacion
{
    class ComProducto : InterfaceProducto
    {
        Conexion objConexion = new Conexion();
        SqlConnection conexion;
        SqlTransaction transaccion = null;
        PerProducto objPerProducto = new PerProducto();

        public Producto obtenerProducto(long xIdProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Producto objProducto = objPerProducto.obtenerProducto(conexion, transaccion, xIdProducto);
                transaccion.Commit();
                return objProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public Boolean existeProducto(long xIdProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerProducto.existeProducto(conexion, transaccion, xIdProducto);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public Boolean existeProducto(String xCodigo, String xNombre)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                Boolean existe = objPerProducto.existeProducto(conexion, transaccion, xCodigo, xNombre);
                transaccion.Commit();
                return existe;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerColeccionProducto()
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colProducto = objPerProducto.obtenerColeccionProducto(conexion, transaccion);
                transaccion.Commit();
                return colProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerBusquedaProducto(String xCodigo, String xNombre, String xDescripcion)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colProducto = objPerProducto.obtenerBusquedaProducto(conexion, transaccion, xCodigo, xNombre, xDescripcion);
                transaccion.Commit();
                return colProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public ArrayList obtenerBusquedaProductoSimult(String xCodigo, String xNombre)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                ArrayList colProducto = new ArrayList();
                if (!xCodigo.Equals("") && !xNombre.Equals("") && xCodigo.Equals(xNombre))
                {
                    colProducto = objPerProducto.obtenerBusquedaProductoSimult(conexion, transaccion, xCodigo, xNombre);
                }
                else
                {
                    colProducto = objPerProducto.obtenerColeccionProducto(conexion, transaccion);
                }
                transaccion.Commit();
                return colProducto;
            }
            catch (Exception ex)
            {
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int altaProducto(Producto xObjProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                xObjProducto.IdProducto = FuncionesGenericas.generarNumerador("PRODUCTO");
                int nro = objPerProducto.altaProducto(conexion, transaccion, xObjProducto);
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int bajaProducto(Producto xObjProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                int nro = objPerProducto.bajaProducto(conexion, transaccion, xObjProducto);
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }

        public int modificaProducto(Producto xObjProducto)
        {
            try
            {
                conexion = objConexion.abrirConexion();
                transaccion = conexion.BeginTransaction();
                int nro = objPerProducto.modificaProducto(conexion, transaccion, xObjProducto);
                transaccion.Commit();
                return nro;
            }
            catch (Exception ex)
            {
                transaccion.Rollback();
                throw new Exception("#Comunicacion# " + ex.Message);
            }
            finally
            {
                objConexion.cerrarConexion();
            }
        }
    }
}
